package service

import (
	"context"
	"gomain/app/model"

	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/frame/g"
)

var Role = roleService{}

type roleService struct{}

// 获取角色列表
func (s *roleService) List(page, limit int) ([]model.Role, int, error) {
	var roles []model.Role

	m := g.DB().Model("roles")
	count, err := m.Count()
	if err != nil {
		return nil, 0, err
	}

	err = m.Page(page, limit).Scan(&roles)
	return roles, count, err
}

// 获取用户的所有角色
func (s *roleService) GetUserRoles(userId int) ([]model.Role, error) {
	var roles []model.Role

	err := g.DB().Model("roles").
		LeftJoin("user_roles", "roles.id = user_roles.role_id").
		Where("user_roles.user_id = ?", userId).
		Scan(&roles)

	return roles, err
}

// 为用户分配角色
func (s *roleService) AssignRoles(userId int, roleIds []int) error {
	ctx := context.Background()
	return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
		// 先删除用户现有的角色
		_, err := tx.Model("user_roles").Where("user_id = ?", userId).Delete()
		if err != nil {
			return err
		}

		// 插入新的角色
		for _, roleId := range roleIds {
			_, err = tx.Model("user_roles").Data(g.Map{
				"user_id": userId,
				"role_id": roleId,
			}).Insert()
			if err != nil {
				return err
			}
		}

		return nil
	})
}

// 为角色分配权限
func (s *roleService) AssignPermissions(roleId int, permissionIds []int) error {
	ctx := context.Background()
	return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
		// 先删除角色现有的权限
		_, err := tx.Model("role_permissions").Where("role_id = ?", roleId).Delete()
		if err != nil {
			return err
		}

		// 插入新的权限
		for _, permissionId := range permissionIds {
			_, err = tx.Model("role_permissions").Data(g.Map{
				"role_id":       roleId,
				"permission_id": permissionId,
			}).Insert()
			if err != nil {
				return err
			}
		}

		return nil
	})
}
